import { onShow, onLoad } from '@dcloudio/uni-app'
import {useChatStore} from '@/store/modules/chatStore.js'
import {useFriendStore} from '@/store/modules/friendStore.js'
import {useUserStore} from '@/store/modules/user'
import { getAccessToken, LogOutFn } from '@/utils/auth'
import * as msgType from '@/utils/imCommon/messageType'
import * as wsApi from '@/utils/imCommon/wssocket';
import * as enums from '@/utils/imCommon/enums';
import {pullOfflineMessage} from '@/api/im'
import { useMessage } from 'wot-design-uni'
import { currRoute } from '@/utils'
export function useIm() {
  const message = useMessage()
  // const isInit = ref(false)
  const isExit = ref(false)
  const audioTip = ref(false)
  const reconnecting = ref(false)

  const chatStore = useChatStore()
  const friendStore = useFriendStore()
  const userStore = useUserStore()

  const imInfo = computed(() =>{
    const { VITE_IM_URL } = import.meta.env
    const url = VITE_IM_URL
    const token = getAccessToken()
    return {
      url, token
    }
  })

  function init (){
    console.log('初始化im')
    reconnecting.value = false
    isExit.value = false
    loadStore().then(() => {
      // 初始化websocket
      initWebSocket();
      // this.isInit = true;
    }).catch((e) => {
      console.log(e);
      exit();
    })
  }
  function loadStore() {
    // return this.userStore.loadUser().then(() => {
      const promises = [];
      promises.push(friendStore.loadFriend());
      promises.push(chatStore.loadChat());
      // promises.push(this.groupStore.loadGroup());
      // promises.push(this.configStore.loadConfig());
      return Promise.all(promises);
    // })
  }
  function initWebSocket() {
    // let loginInfo = uni.getStorageSync("loginInfo")
    wsApi.connect(imInfo.value.url, imInfo.value.token);
    wsApi.onConnect(() => {
      if (reconnecting.value) {
        // 重连成功
        onReconnectWs();
      } else {
        // 加载离线消息
        pullPrivateOfflineMessage(chatStore.privateMsgMaxId);
        // this.pullGroupOfflineMessage(this.chatStore.groupMsgMaxId);
      }
    });
    wsApi.onMessage(async(cmd, msgInfo) => {
      if (cmd == 2) {
        // 异地登录，强制下线
        // uni.showModal({
        //   content: '您已在其他地方登录，将被强制下线',
        //   showCancel: false,
        // })
        exit();
        message .alert({
          msg: '您已在其他设备登录，将被强制下线',
          title: '提示',
          confirmButtonProps: {
            type: 'error'
          }
        })
        .then(async() => {
          const currentPage = currRoute()
          uni.reLaunch({ url: `/pages/login/login?redirect=${currentPage.path}` })
        })
      } else if (cmd == 3) {
        // 私聊消息
        handlePrivateMessage(msgInfo);
      } else if (cmd == 4) {
        // 群聊消息
        // handleGroupMessage(msgInfo);
      } else if (cmd == 5) {
        // 系统消息
        // handleSystemMessage(msgInfo);
      }
    });
    wsApi.onClose((res) => {
      console.log("ws断开", res);
      // 重新连接
      reconnectWs();

    })
  }
  function reconnectWs() {
    // 已退出则不再重连
    if (isExit.value) {
      return;
    }
    // 记录标志
    reconnecting.value = true;
    // 重新加载一次个人信息，目的是为了保证网络已经正常且token有效
    // this.userStore.loadUser().then((userInfo) => {
    //   uni.showToast({
    //     title: '连接已断开，尝试重新连接...',
    //     icon: 'none'
    //   })
    //   // 重新连接
    //   let loginInfo = uni.getStorageSync("loginInfo")
    //   wsApi.reconnect(UNI_APP.WS_URL, loginInfo.accessToken);
    // }).catch(() => {
    //   // 5s后重试
    //   setTimeout(() => {
    //     reconnectWs();
    //   }, 5000)
    // })
    try {
      // uni.showToast({
      //   title: '连接已断开，尝试重新连接...',
      //   icon: 'none'
      // })
      const { url, token } = imInfo.value
      wsApi.reconnect(url, token)
    } catch {
      setTimeout(() => reconnectWs(), 5000)
    }
  }
  function onReconnectWs() {
    reconnecting.value = false;
    // 重新加载好友和群聊
    const promises = [];
    promises.push(friendStore.loadFriend());
    // promises.push(this.groupStore.loadGroup());
    Promise.all(promises).then(() => {
      uni.showToast({
        title: "已重新连接",
        icon: 'none'
      })
      // 加载离线消息
      pullPrivateOfflineMessage(chatStore.privateMsgMaxId);
      // this.pullGroupOfflineMessage(this.chatStore.groupMsgMaxId);
    }).catch((e) => {
      console.log(e);
      exit()
    })
  }
  function pullPrivateOfflineMessage(minId) {
    chatStore.setLoadingPrivateMsg(true)
    // http({
    //   url: "/message/private/pullOfflineMessage?minId=" + minId,
    //   method: 'GET'
    // })
    pullOfflineMessage({minId}).catch(() => {
      chatStore.setLoadingPrivateMsg(false)
    })
  }
  // pullGroupOfflineMessage(minId) {
  //   this.chatStore.setLoadingGroupMsg(true)
  //   http({
  //     url: "/message/group/pullOfflineMessage?minId=" + minId,
  //     method: 'GET'
  //   }).catch(() => {
  //     this.chatStore.setLoadingGroupMsg(false)
  //   })
  // },
  function handlePrivateMessage(msg) {
    // 标记这条消息是不是自己发的
    msg.selfSend = msg.sendId == userStore.getUser.id;
    // 好友id
    let friendId = msg.selfSend ? msg.recvId : msg.sendId;
    // 会话信息
    let chatInfo = {
      type: 'PRIVATE',
      targetId: friendId
    }
    // 消息加载标志
    if (msg.type == enums.MESSAGE_TYPE.LOADING) {
      chatStore.setLoadingPrivateMsg(JSON.parse(msg.content))
      return;
    }
    // 消息已读处理，清空已读数量
    if (msg.type == enums.MESSAGE_TYPE.READED) {
      chatStore.resetUnreadCount(chatInfo);
      return;
    }
    // 消息回执处理,改消息状态为已读
    if (msg.type == enums.MESSAGE_TYPE.RECEIPT) {
      chatStore.readedMessage({
        friendId: msg.sendId
      })
      return;
    }
    // 消息撤回
    if (msg.type == enums.MESSAGE_TYPE.RECALL) {
      chatStore.recallMessage(msg, chatInfo);
      return;
    }
    // 新增好友
    if (msg.type == enums.MESSAGE_TYPE.FRIEND_NEW) {
      friendStore.addFriend(JSON.parse(msg.content));
      return;
    }
    // 删除好友
    if (msg.type == enums.MESSAGE_TYPE.FRIEND_DEL) {
      friendStore.removeFriend(friendId);
      return;
    }
    // 消息插入
    let friend = loadFriendInfo(friendId);
    insertPrivateMessage(friend, msg);
  }
  function insertPrivateMessage(friend, msg) {
    // 单人视频信令
    if (msgType.isRtcPrivate(msg.type)) {
      // #ifdef MP-WEIXIN
      // 小程序不支持音视频
      return;
      // #endif
      // 被呼叫，弹出视频页面
      let delayTime = 100;
      if (msg.type == enums.MESSAGE_TYPE.RTC_CALL_VOICE ||
        msg.type == enums.MESSAGE_TYPE.RTC_CALL_VIDEO) {
        let mode = msg.type == enums.MESSAGE_TYPE.RTC_CALL_VIDEO ? "video" : "voice";
        let pages = getCurrentPages();
        let curPage = pages[pages.length - 1].route;
        if (curPage != "pages/chat/chat-private-video") {
          const friendInfo = encodeURIComponent(JSON.stringify(friend));
          uni.navigateTo({
            url: `/pages/chat/chat-private-video?mode=${mode}&friend=${friendInfo}&isHost=false`
          })
          delayTime = 500;
        }
      }
      setTimeout(() => {
        uni.$emit('WS_RTC_PRIVATE', msg);
      }, delayTime)
      return;
    }
    // 插入消息
    if (msgType.isNormal(msg.type) || msgType.isTip(msg.type) || msgType.isAction(msg.type)) {
      let chatInfo = {
        type: 'PRIVATE',
        targetId: friend.id,
        showName: friend.nickname,
        headImage: friend.headImage
      };
      // 打开会话
      chatStore.openChat(chatInfo);
      // 插入消息
      chatStore.insertMessage(msg, chatInfo);
      // console.log("🚀 ~ insertPrivateMessage ~ msg, chatInfo:", msg, chatInfo)
      // 播放提示音
      playAudioTip();
    }
  }
  // handleGroupMessage(msg) {
  //   // 标记这条消息是不是自己发的
  //   msg.selfSend = msg.sendId == this.userStore.userInfo.id;
  //   let chatInfo = {
  //     type: 'GROUP',
  //     targetId: msg.groupId
  //   }
  //   // 消息加载标志
  //   if (msg.type == enums.MESSAGE_TYPE.LOADING) {
  //     this.chatStore.setLoadingGroupMsg(JSON.parse(msg.content))
  //     return;
  //   }
  //   // 消息已读处理
  //   if (msg.type == enums.MESSAGE_TYPE.READED) {
  //     // 我已读对方的消息，清空已读数量
  //     this.chatStore.resetUnreadCount(chatInfo)
  //     return;
  //   }
  //   // 消息回执处理
  //   if (msg.type == enums.MESSAGE_TYPE.RECEIPT) {
  //     // 更新消息已读人数
  //     let msgInfo = {
  //       id: msg.id,
  //       groupId: msg.groupId,
  //       readedCount: msg.readedCount,
  //       receiptOk: msg.receiptOk
  //     };
  //     this.chatStore.updateMessage(msgInfo, chatInfo)
  //     return;
  //   }
  //   // 消息撤回
  //   if (msg.type == enums.MESSAGE_TYPE.RECALL) {
  //     this.chatStore.recallMessage(msg, chatInfo)
  //     return;
  //   }
  //   // 新增群
  //   if (msg.type == enums.MESSAGE_TYPE.GROUP_NEW) {
  //     this.groupStore.addGroup(JSON.parse(msg.content));
  //     return;
  //   }
  //   // 删除群
  //   if (msg.type == enums.MESSAGE_TYPE.GROUP_DEL) {
  //     this.groupStore.removeGroup(msg.groupId);
  //     return;
  //   }
  //   // 插入消息
  //   let group = this.loadGroupInfo(msg.groupId);
  //   this.insertGroupMessage(group, msg);

  // },
  // handleSystemMessage(msg) {
  //   if (msg.type == enums.MESSAGE_TYPE.USER_BANNED) {
  //     // 用户被封禁
  //     wsApi.close(3099);
  //     uni.showModal({
  //       content: '您的账号已被管理员封禁，原因:' + msg.content,
  //       showCancel: false,
  //     })
  //     this.exit();
  //   }
  // },
  // insertGroupMessage(group, msg) {
  //   // 群视频信令
  //   if (msgType.isRtcGroup(msg.type)) {
  //     // #ifdef MP-WEIXIN
  //     // 小程序不支持音视频
  //     return;
  //     // #endif
  //     // 被呼叫，弹出视频页面
  //     let delayTime = 100;
  //     if (msg.type == enums.MESSAGE_TYPE.RTC_GROUP_SETUP) {
  //       let pages = getCurrentPages();
  //       let curPage = pages[pages.length - 1].route;
  //       if (curPage != "pages/chat/chat-group-video") {
  //         const userInfos = encodeURIComponent(msg.content);
  //         const inviterId = msg.sendId;
  //         const groupId = msg.groupId
  //         uni.navigateTo({
  //           url: `/pages/chat/chat-group-video?groupId=${groupId}&isHost=false
  //               &inviterId=${inviterId}&userInfos=${userInfos}`
  //         })
  //         delayTime = 500;
  //       }
  //     }
  //     // 消息转发到chat-group-video页面进行处理
  //     setTimeout(() => {
  //       uni.$emit('WS_RTC_GROUP', msg);
  //     }, delayTime)
  //     return;
  //   }
  //   // 插入消息
  //   if (msgType.isNormal(msg.type) || msgType.isTip(msg.type) || msgType.isAction(msg.type)) {
  //     let chatInfo = {
  //       type: 'GROUP',
  //       targetId: group.id,
  //       showName: group.showGroupName,
  //       headImage: group.headImageThumb
  //     };
  //     // 打开会话
  //     this.chatStore.openChat(chatInfo);
  //     // 插入消息
  //     this.chatStore.insertMessage(msg, chatInfo);
  //     // 播放提示音
  //     this.playAudioTip();
  //   }
  // },
  function loadFriendInfo(id) {
    let friend = friendStore.findFriend(id);
    if (!friend) {
      console.log("未知用户:", id)
      friend = {
        id: id,
        showNickName: "未知用户",
        headImage: ""
      }
    }
    return friend;
  }
  async function exit() {
    console.log("exit");
    isExit.value = true;
    wsApi.close(3099);
    // uni.removeStorageSync("loginInfo");
    // uni.reLaunch({
    //   url: "/pages/login/login"
    // })
    // unloadStore();
    await LogOutFn(false)
  }
  function playAudioTip() {
    // 音频播放无法成功
    // this.audioTip = uni.createInnerAudioContext();
    // this.audioTip.src =  "/static/audio/tip.wav";
    // this.audioTip.play();
  }
  function unloadStore() {
    friendStore.clear();
    chatStore.clear();
    // groupStore.clear();
    // configStore.clear();
    // userStore.clear();
  }
  onShow((options) => {

  })
  onLoad(() => {
    console.log('加载im')
  })

  return {
    init
  }
}